#ifndef OCK_MEMORY_BRIDGE_HMO_SPECIFICATION_H
#define OCK_MEMORY_BRIDGE_HMO_SPECIFICATION_H
#include <ostream>
namespace ock {
namespace hmm {
struct OckHmmMemoryCapacitySpecification
{
    uint64_t maxDataCapacity {0ULL};
    uint64_t maxSwapCapacity {0ULL};
} __attributes__(packed);

struct OckHmmMemorySpecification
{
    OckHmmMemoryCapacitySpecification devSpec;
    OckHmmMemoryCapacitySpecification hostSpec;

} __attributes__(packed);

struct OckHmmMemoryUsedInfo
{
    OckHmmMemoryUsedInfo(void);
    OckHmmMemoryUsedInfo &operator+=(const OckHmmMemoryUsedInfo &other);
    uint64_t usedBytes;
    uint64_t unusedFragBytes;
    uint64_t leftBytes;
    uint64_t swapUsedBytes;
    uint64_t swapLeftBytes;

} __attributes__(packed);

struct OckHmmResourceUsedInfo
{
    OckHmmMemoryUsedInfo devUsedInfo;
    OckHmmMemoryUsedInfo hostUsedInfo;

} __attributes__(packed);

bool operator==(const OckHmmMemoryCapacitySpecification &lhs, const OckHmmMemoryCapacitySpecification &rhs)
bool operator==(const OckHmmMemorySpecification &lhs, const OckHmmMemorySpecification &rhs)
bool operator==(const OckHmmMemoryUsedInfo &lhs, const OckHmmMemoryUsedInfo &rhs)
bool operator==(const OckHmmResourceUsedInfo &lhs, const OckHmmResourceUsedInfo &rhs)

bool operator!=(const OckHmmMemoryCapacitySpecification &lhs, const OckHmmMemoryCapacitySpecification &rhs)
bool operator!=(const OckHmmMemorySpecification &lhs, const OckHmmMemorySpecification &rhs)
bool operator!=(const OckHmmMemoryUsedInfo &lhs, const OckHmmMemoryUsedInfo &rhs)
bool operator!=(const OckHmmResourceUsedInfo &lhs, const OckHmmResourceUsedInfo &rhs)

std::ostream &operator<<(std::ostream &os, OckHmmMemoryCapacitySpecification &memorySpec);
std::ostream &operator<<(std::ostream &os, OckHmmMemorySpecification &memorySpec);
std::ostream &operator<<(std::ostream &os, OckHmmMemoryUsedInfo &usedInfo);
std::ostream &operator<<(std::ostream &os, OckHmmResourceUsedInfo &usedInfo);

}
}
#endif